package uy.org.softtech.cssuite.web.entidad;

import static org.springframework.util.Assert.notNull;

import javax.xml.bind.annotation.XmlTransient;

@XmlTransient
public class AgenteUsuario {
	
	private Navegador navegador = Navegador.NO_DEFINIDO;
	private Plataforma plataforma = Plataforma.NO_DEFINIDO;
	private Arquitectura arquitectura = Arquitectura.NO_DEFINIDO;
	
	public AgenteUsuario(String navegador) {
		notNull(navegador, "Detalles del navegador no puede ser nulo.");
		extraerValores(navegador.toLowerCase());
	}
	
	private void extraerValores(String navegador) {
		
		//Navegador
		if(navegador.indexOf("firefox") > 0) {
			this.navegador = Navegador.FIREFOX;
		} else if(navegador.indexOf("chrome") > 0) {
			this.navegador = Navegador.CHROME;
		} else if(navegador.indexOf("opera") > 0) {
			this.navegador = Navegador.OPERA;
		} else if(navegador.indexOf("safari") > 0) {
			this.navegador = Navegador.SAFARI;
		} else if(navegador.indexOf("msie 6.0") > 0) {
			this.navegador = Navegador.MSIE_6;
		} else if(navegador.indexOf("msie 7.0") > 0) {
			this.navegador = Navegador.MSIE_7;
		} else if(navegador.indexOf("msie 8.0") > 0) {
			this.navegador = Navegador.MSIE_8;
		} else if(navegador.indexOf("msie 9.0") > 0) {
			this.navegador = Navegador.MSIE_9;
		} else if(navegador.indexOf("msie 10.0") > 0) {
			this.navegador = Navegador.MSIE_10;
		}
		
		//Plataforma
		if(navegador.indexOf("windows") > 0) {
			this.plataforma = Plataforma.WINDOWS;
		} else if(navegador.indexOf("linux") > 0) {
			this.plataforma = Plataforma.LINUX;
		} else if(navegador.indexOf("macintosh") > 0) {
			this.plataforma = Plataforma.MAC;
		}
		
		//Arquitectura
		if(this.plataforma != null) {
			switch (this.plataforma) {
			case LINUX:
				if(navegador.indexOf("x86_64") > 0) {
					this.arquitectura = Arquitectura._64BITS;
				} else {
					this.arquitectura = Arquitectura._32BITS;
				}
				break;
			case WINDOWS:
				if(navegador.indexOf("wow64") > 0) {
					this.arquitectura = Arquitectura._64BITS;
				} else {
					this.arquitectura = Arquitectura._32BITS;
				}
				break;
			case MAC:
				this.arquitectura = Arquitectura.NO_DEFINIDO; // TODO Ver valores correctos
				break;
			}
		}
	}
	
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("AgenteUsuario [");
		builder.append("navegador=" + getNavegador().getNombre() + ", ");
		builder.append("plataforma=" + getPlataforma().getNombre() + ", ");
		builder.append("arquitectura=[" + getArquitectura().getNombre() + "]");
		builder.append("]");
		return builder.toString();
	}

	public Navegador getNavegador() {
		return navegador;
	}
	public Plataforma getPlataforma() {
		return plataforma;
	}
	public Arquitectura getArquitectura() {
		return arquitectura;
	}

	public enum Navegador {
		CHROME("Chrome"), 
		FIREFOX("Firefox"), 
		MSIE_6("Internet Explorer 6"), 
		MSIE_7("Internet Explorer 7"), 
		MSIE_8("Internet Explorer 8"), 
		MSIE_9("Internet Explorer 9"), 
		MSIE_10("Internet Explorer 10"), 
		OPERA("Opera"), 
		SAFARI("Safari"),
		NO_DEFINIDO("No definido");
		
		private String nombre;
		
		Navegador(String nombre) {
			this.nombre = nombre;
		}
		
		public String getNombre() {
			return nombre;
		}
	}
	
	public enum Plataforma {
		LINUX("Linux"), 
		MAC("Mac"), 
		WINDOWS("MS Windows"),
		NO_DEFINIDO("No definido");
		
		private String nombre;
		
		Plataforma(String nombre) {
			this.nombre = nombre;
		}
		
		public String getNombre() {
			return nombre;
		}
	}
	
	public enum Arquitectura {
		_32BITS("X86"), 
		_64BITS("X86_64"),
		NO_DEFINIDO("No definido");
		
		private String nombre;
		
		Arquitectura(String nombre) {
			this.nombre = nombre;
		}
		
		public String getNombre() {
			return nombre;
		}
	}

}
